//  Copyright (c) 2017-2018 Uber Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package tree

import (
	"fmt"

	"github.com/uber/aresdb/query/sql/util"
)

// SimpleGroupBy is group by
type SimpleGroupBy struct {
	IGroupingElement
	// Columns is group by columns
	Columns []IExpression
}

// NewSimpleGroupBy creates SimpleGroupBy
func NewSimpleGroupBy(location *NodeLocation, expressions []IExpression) *SimpleGroupBy {
	errMsg := fmt.Sprintf("simpleGroupByExpressions is null at (line:%d, col:%d)", location.Line, location.CharPosition)
	util.RequireNonNull(expressions, errMsg)
	return &SimpleGroupBy{
		NewGroupingElement(location),
		expressions,
	}
}

// Accept accepts visitor
func (q *SimpleGroupBy) Accept(visitor AstVisitor, ctx interface{}) interface{} {
	return visitor.VisitSimpleGroupBy(q, ctx)
}
